using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using MakeIT.Framework.Util;
using MakeIT.SGI.ERP.Entidades;
using MakeIT.SGI.ERP.Negocios;

namespace MakeIT.SGI.ERP.Apresentacao
{
	public partial class CadastroProduto : System.Web.UI.Page
	{

		UsuarioVO usuarioVO = null;
		protected SgiDAOT SgiDAOT = null;

		protected void Page_Load(object sender, EventArgs e)
		{
			this.SgiDAOT = new SgiDAOT();
			usuarioVO = (UsuarioVO)this.Session["userActive"];

			if (!IsPostBack)
			{
				Util.HabilitarCampos(false, this.panelCad);

				this.panelProdutoatributo.Enabled = false;
			}

		}

		protected void Page_Unload(object sender, EventArgs e)
		{
			try
			{
				if (this.SgiDAOT != null)
					this.SgiDAOT.closeDAO();
			}
			catch (Exception ex) {}
		}

		protected void grvResultado_PageIndexChanging(object sender, GridViewPageEventArgs e)
		{
			this.grvResultado.PageIndex = e.NewPageIndex;
			btnPesquisa_Click(null, null);
		}
		/// <summary>
		/// Manipula o evento do botão btnSalvar
		/// </summary>
		/// <param name="sender">Objeto disparador do evento</param>
		/// <param name="e">Argumento do evento</param>
		protected void btnSalvar_Click(object sender, EventArgs e)
		{

			//Declara objetos
			ProdutoVO produtoVO = null;
			bool novoRegistro = false;

			try
			{
				//Verifica se o ID é nulo, se sim = cadastro novo
				if (string.IsNullOrEmpty(this.txtCadIdProduto.Text))
				{
					produtoVO = ProdutoVO.CreateVO();
					produtoVO.cadastro = DateTime.Now;
					produtoVO.cadastradoPor = usuarioVO.user;

					novoRegistro = true;

				}
				//Recupera dados para serem alterados
				else
				{
					//Recupera dados
					produtoVO = this.SgiDAOT.getProduto(Int32.Parse(this.txtCadIdProduto.Text));
				}

				produtoVO.produto = this.txtCadProduto.Text;
				produtoVO.edicao = DateTime.Now;
				produtoVO.editadoPor = usuarioVO.user;

				//Chama metodo para salvar ou criar novo registro
				if (novoRegistro)
					produtoVO.idProduto = (int)this.SgiDAOT.newProduto(produtoVO);
				else
					this.SgiDAOT.setProduto(produtoVO);

				// Exibe msg de sucesso ao salvar registro
				Util.ExibeAlert(this, "Registro salvo com sucesso!");

				//Popula grid atualizado
				this.btnPesquisa_Click(null, null);

				//Atualiza formulario, apos salvar os dados
				this.txtCadIdProduto.Text = produtoVO.idProduto.ToString();
				this.ltCadastradoPor.Text = produtoVO.cadastradoPor;
				this.ltEditadoPor.Text = produtoVO.editadoPor;
				this.ltDataCadastro.Text = produtoVO.cadastro.ToString("dd/MM/yyyy");
				this.ltDataEdicao.Text = produtoVO.edicao.ToString("dd/MM/yyyy");

				//habilita Produtoatributo
				if (!this.panelProdutoatributo.Enabled)
				{
					this.ltCadProdutoatributoProduto.Text = produtoVO.ToString();
					Util.HabilitarCampos(false, this.panelProdutoatributo);
					this.panelProdutoatributo.Enabled = true;
					this.btnCadProdutoatributoSalvar.Enabled = false;
					this.btnCadProdutoatributoEditar.Enabled = false;
					this.btnCadProdutoatributoExcluir.Enabled = false;
					this.btnCadProdutoatributoNovo.Enabled = true;
				}
			}
			catch (Exception ex)
			{

				throw ex;
			}
		}

		/// <summary>
		/// Manipula o evento do botão btnPesquisa
		/// </summary>
		/// <param name="sender">Objeto disparador do evento</param>
		/// <param name="e">Argumento do evento</param>
		protected void btnPesquisa_Click(object sender, EventArgs e)
		{

			//Declara objetos
			int? idProduto = null;
			string produto = null;

			try
			{

				if (!string.IsNullOrEmpty(this.txtIdProduto.Text))
				{
					idProduto = Int32.Parse(this.txtIdProduto.Text);
				}

				if (!string.IsNullOrEmpty(this.txtProduto.Text))
				{
					produto = this.txtProduto.Text;
				}


				//Recupera a lista de registros segundo a pesquisa
				this.grvResultado.DataSource = this.SgiDAOT.getProdutos(idProduto, produto);

				//Vincula os dados
				this.grvResultado.DataBind();
			}
			catch (Exception ex)
			{

				throw ex;
			}
		}

		/// <summary>
		/// Manipula o evento do botão btnCancelar
		/// </summary>
		/// <param name="sender">Objeto disparador do evento</param>
		/// <param name="e">Argumento do evento</param>
		protected void btnCancelar_Click(object sender, EventArgs e)
		{
			//Volta para a tab page de pesquisa
			//this.tabProduto.ActiveTabIndex = 0;

			// Desabilita os campos para edição
			Util.HabilitarCampos(false, this.panelCad);

			// Destrava botão de edição
			this.btnEditar.Enabled = (!string.IsNullOrEmpty(this.txtCadIdProduto.Text));

			// Destrava botão de exclusao
			this.btnExcluir.Enabled = (!string.IsNullOrEmpty(this.txtCadIdProduto.Text));

			// Detrava botão de novo
			this.btnNovo.Enabled = true;

			// Desabilita o botão salvar
			this.btnSalvar.Enabled = false;

		}

		protected void imgbVisualizar_Click(object sender, ImageClickEventArgs e)
		{
			// Declara objetos
			ProdutoVO produtoVO = null;
			int idProduto = 0;

			try
			{
				//Recupera os argumentos com o ID do objeto
				string[] argumentos = ((ImageButton)sender).CommandArgument.Split(';');
				idProduto = Int32.Parse(argumentos[0]);

				//Recupera o objeto
				produtoVO = this.SgiDAOT.getProduto(idProduto);

				this.txtCadIdProduto.Text = produtoVO.idProduto.ToString();
				this.txtCadProduto.Text = produtoVO.produto;
				this.ltCadastradoPor.Text = produtoVO.cadastradoPor;
				this.ltEditadoPor.Text = produtoVO.editadoPor;
				this.ltDataCadastro.Text = produtoVO.cadastro.ToString("dd/MM/yyyy");
				this.ltDataEdicao.Text = produtoVO.edicao.ToString("dd/MM/yyyy");

				//recupera Produtoatributo
				Util.LimparCampos(this.panelProdutoatributo);
				Util.HabilitarCampos(false, this.panelProdutoatributo);
				this.panelProdutoatributo.Enabled = true;
				this.ltCadProdutoatributoProduto.Text = produtoVO.ToString();
				this.ltProdutoatributoCadastradoPor.Text = "";
				this.ltProdutoatributoDataCadastro.Text = "";
				this.ltProdutoatributoDataEdicao.Text = "";
				this.ltProdutoatributoEditadoPor.Text = "";
				this.btnCadProdutoatributoSalvar.Enabled = false;
				this.btnCadProdutoatributoEditar.Enabled = false;
				this.btnCadProdutoatributoExcluir.Enabled = false;
				this.btnCadProdutoatributoNovo.Enabled = true;
				this.grvCadProdutoxProdutoatributo.DataSource = this.SgiDAOT.getProdutoatributos(null, null, produtoVO.idProduto);
				this.grvCadProdutoxProdutoatributo.DataBind();

				//Habilita tab page do cadastro
				this.tabProduto.ActiveTabIndex = 1;

				//Desabilita campos para edição
				Util.HabilitarCampos(false, this.panelCad);

				//Desabilita botão salvar
				this.btnSalvar.Enabled = false;

				//Habilita botão editar
				this.btnEditar.Enabled = true;

				//Habilita botão excluir
				this.btnExcluir.Enabled = true;

				//Habilita botão novo
				this.btnNovo.Enabled = true;

			}
			catch (Exception ex)
			{

				throw ex;
			}
		}

		// <summary>
		// Manipula o evento editar do web form
		// </summary>
		// <param name="sender">Objeto disparador de evento</param>
		// <param name="e">Argumento do evento</param>
		protected void btnEditar_Click(object sender, EventArgs e)
		{
			// Habilita os campos para edição
			Util.HabilitarCampos(true, this.panelCad);

			// Trava apenas os text box da PK
			this.txtCadIdProduto.Enabled = false;

			// Trava botão de edição
			this.btnEditar.Enabled = false;

			// Trava botão de exclusao
			this.btnExcluir.Enabled = false;

			// Trava botão de novo
			this.btnNovo.Enabled = false;

			// Habilita o botão salvar
			this.btnSalvar.Enabled = true;

			this.txtCadProduto.Focus();
		}

		protected void btnNovo_Click(object sender, EventArgs e)
		{
			//Limpa formulario, para a entrada de novo registro
			Util.LimparCampos(this.panelCad);
			// Habilita os campos para edição
			Util.HabilitarCampos(true, this.panelCad);

			this.ltCadastradoPor.Text = "";
			this.ltEditadoPor.Text = "";
			this.ltDataCadastro.Text = "";
			this.ltDataEdicao.Text = "";

			// Limpa Produtoatributo
			Util.LimparCampos(this.panelProdutoatributo);
			Util.HabilitarCampos(false, this.panelProdutoatributo);
			this.ltCadProdutoatributoProduto.Text = "";
			this.ltProdutoatributoCadastradoPor.Text = "";
			this.ltProdutoatributoDataCadastro.Text = "";
			this.ltProdutoatributoDataEdicao.Text = "";
			this.ltProdutoatributoEditadoPor.Text = "";
			this.grvCadProdutoxProdutoatributo.DataSource = null;
			this.grvCadProdutoxProdutoatributo.DataBind();
			this.panelProdutoatributo.Enabled = false;
			this.btnCadProdutoatributoSalvar.Enabled = false;
			this.btnCadProdutoatributoEditar.Enabled = false;
			this.btnCadProdutoatributoExcluir.Enabled = false;
			this.btnCadProdutoatributoNovo.Enabled = false;

			// Trava apenas os text box da PK
			this.txtCadIdProduto.Enabled = false;

			// Trava botão de edição
			this.btnEditar.Enabled = false;

			// Trava botão de exclusao
			this.btnExcluir.Enabled = false;

			// Trava botão de novo
			this.btnNovo.Enabled = false;

			// Habilita o botão salvar
			this.btnSalvar.Enabled = true;

			this.txtCadProduto.Focus();

		}

		protected void btnExcluir_Click(object sender, EventArgs e)
		{
			//Declara objetos
			ProdutoVO produtoVO = null;

			try
			{
				//Cria objeto
				produtoVO = ProdutoVO.CreateVO();
				produtoVO.idProduto = Int32.Parse(this.txtCadIdProduto.Text);

				// Remove Produtoatributo
				List<ProdutoatributoVO> produtoatributoVOs = SgiDAOT.getProdutoatributos(null, null, produtoVO.idProduto);
				foreach (ProdutoatributoVO produtoatributoVO in produtoatributoVOs)
					this.SgiDAOT.delProdutoatributo(produtoatributoVO);

				//Chama metodo para excluir registro
				this.SgiDAOT.delProduto(produtoVO);

				// Exibe msg de sucesso ao salvar registro
				Util.ExibeAlert(this, "Registro excluido com sucesso!");

				//Popula grid atualizado
				this.btnPesquisa_Click(null, null);

				//Limpa formulario, apos salvar os dados
				Util.LimparCampos(this.panelCad);
				//Limpa Produtoatributo
				Util.LimparCampos(this.panelProdutoatributo);
				Util.HabilitarCampos(false, this.panelProdutoatributo);
				this.panelProdutoatributo.Enabled = false;
				this.ltCadProdutoatributoProduto.Text = "";
				this.ltProdutoatributoCadastradoPor.Text = "";
				this.ltProdutoatributoDataCadastro.Text = "";
				this.ltProdutoatributoDataEdicao.Text = "";
				this.ltProdutoatributoEditadoPor.Text = "";
				this.grvCadProdutoxProdutoatributo.DataSource = null;
				this.grvCadProdutoxProdutoatributo.DataBind();
				this.btnCadProdutoatributoSalvar.Enabled = false;
				this.btnCadProdutoatributoEditar.Enabled = false;
				this.btnCadProdutoatributoExcluir.Enabled = false;
				this.btnCadProdutoatributoNovo.Enabled = false;

				this.ltCadastradoPor.Text = "";
				this.ltEditadoPor.Text = "";
				this.ltDataCadastro.Text = "";
				this.ltDataEdicao.Text = "";

				// Trava botão de edição
				this.btnEditar.Enabled = false;

				// Trava botão de exclusao
				this.btnExcluir.Enabled = false;

				// Desabilita o botão salvar
				this.btnSalvar.Enabled = false;

				// Habilita o botao novo
				this.btnNovo.Enabled = true;

			}
			catch (Exception ex)
			{

				throw ex;
			}
			
		}
		#region ProdutoXProdutoatributo
		protected void btnCadProdutoatributoSalvar_Click(object sender, EventArgs e)
		{

			//Declara objetos
			ProdutoatributoVO produtoatributoVO = null;
			bool novoRegistro = false;

			try
			{
				//Verifica se o ID é nulo, se sim = cadastro novo
				if (string.IsNullOrEmpty(this.txtCadProdutoatributoIdProdutoAtributo.Text))
				{
					produtoatributoVO = ProdutoatributoVO.CreateVO();
					produtoatributoVO.cadastro = DateTime.Now;
					produtoatributoVO.cadastradoPor = usuarioVO.user;

					novoRegistro = true;

				}
				//Recupera dados para serem alterados
				else
				{
					//Recupera dados
					produtoatributoVO = this.SgiDAOT.getProdutoatributo(Int32.Parse(this.txtCadProdutoatributoIdProdutoAtributo.Text));
				}

				produtoatributoVO.idProduto = Int32.Parse(this.txtCadIdProduto.Text);
				produtoatributoVO.atributo = this.txtCadProdutoatributoAtributo.Text;
				if(string.IsNullOrEmpty(this.txtCadProdutoatributoValor.Text))
					produtoatributoVO.valor = null;
				else
					produtoatributoVO.valor = this.txtCadProdutoatributoValor.Text;
				produtoatributoVO.edicao = DateTime.Now;
				produtoatributoVO.editadoPor = usuarioVO.user;

				//Chama metodo para salvar ou criar novo registro
				if (novoRegistro)
					produtoatributoVO.idProdutoAtributo = (int)this.SgiDAOT.newProdutoatributo(produtoatributoVO);
				else
					this.SgiDAOT.setProdutoatributo(produtoatributoVO);

				// Exibe msg de sucesso ao salvar registro
				Util.ExibeAlert(this, "Registro salvo com sucesso!");

				//Popula grid atualizado
				this.btnPesquisa_Click(null, null);

				//Atualiza formulario, apos salvar os dados
				this.txtCadProdutoatributoIdProdutoAtributo.Text = produtoatributoVO.idProdutoAtributo.ToString();
				this.ltProdutoatributoCadastradoPor.Text = produtoatributoVO.cadastradoPor;
				this.ltProdutoatributoEditadoPor.Text = produtoatributoVO.editadoPor;
				this.ltProdutoatributoDataCadastro.Text = produtoatributoVO.cadastro.ToString("dd/MM/yyyy");
				this.ltProdutoatributoDataEdicao.Text = produtoatributoVO.edicao.ToString("dd/MM/yyyy");

				this.grvCadProdutoxProdutoatributo.DataSource = this.SgiDAOT.getProdutoatributos(null, null, Int32.Parse(this.txtCadIdProduto.Text));
				this.grvCadProdutoxProdutoatributo.DataBind();

			}
			catch (Exception ex)
			{

				throw ex;
			}
		}

		protected void btnCadProdutoatributoCancelar_Click(object sender, EventArgs e)
		{
			//Volta para a tab page de pesquisa
			//this.tabProduto.ActiveTabIndex = 0;

			// Desabilita os campos para edição
			Util.HabilitarCampos(false, this.panelProdutoatributo);

			// Destrava botão de edição
			this.btnCadProdutoatributoEditar.Enabled = (!string.IsNullOrEmpty(this.txtCadProdutoatributoIdProdutoAtributo.Text));

			// Destrava botão de exclusao
			this.btnCadProdutoatributoExcluir.Enabled = (!string.IsNullOrEmpty(this.txtCadProdutoatributoIdProdutoAtributo.Text));

			// Detrava botão de novo
			this.btnCadProdutoatributoNovo.Enabled = true;

			// Desabilita o botão salvar
			this.btnCadProdutoatributoSalvar.Enabled = false;

		}

		protected void btnCadProdutoatributoEditar_Click(object sender, EventArgs e)
		{
			// Habilita os campos para edição
			Util.HabilitarCampos(true, this.panelProdutoatributo);

			// Trava apenas os text box da PK
			this.txtCadProdutoatributoIdProdutoAtributo.Enabled = false;

			// Trava botão de edição
			this.btnCadProdutoatributoEditar.Enabled = false;

			// Trava botão de exclusao
			this.btnCadProdutoatributoExcluir.Enabled = false;

			// Trava botão de novo
			this.btnCadProdutoatributoNovo.Enabled = false;

			// Habilita o botão salvar
			this.btnCadProdutoatributoSalvar.Enabled = true;

			this.txtCadProdutoatributoAtributo.Focus();
		}

		protected void btnCadProdutoatributoExcluir_Click(object sender, EventArgs e)
		{
			//Declara objetos
			ProdutoatributoVO produtoatributoVO = null;

			try
			{
				//Cria objeto
				produtoatributoVO = ProdutoatributoVO.CreateVO();
				produtoatributoVO.idProdutoAtributo = Int32.Parse(this.txtCadProdutoatributoIdProdutoAtributo.Text);

				//Chama metodo para excluir registro
				this.SgiDAOT.delProdutoatributo(produtoatributoVO);

				// Exibe msg de sucesso ao salvar registro
				Util.ExibeAlert(this, "Registro excluido com sucesso!");

				//Limpa formulario, apos salvar os dados
				Util.LimparCampos(this.panelProdutoatributo);
				Util.HabilitarCampos(false, this.panelProdutoatributo);
				this.grvCadProdutoxProdutoatributo.DataSource = this.SgiDAOT.getProdutoatributos(null, null, Int32.Parse(this.txtCadIdProduto.Text));
				this.grvCadProdutoxProdutoatributo.DataBind();

				this.ltProdutoatributoCadastradoPor.Text = "";
				this.ltProdutoatributoEditadoPor.Text = "";
				this.ltProdutoatributoDataCadastro.Text = "";
				this.ltProdutoatributoDataEdicao.Text = "";

				// Trava botão de edição
				this.btnCadProdutoatributoEditar.Enabled = false;

				// Trava botão de exclusao
				this.btnCadProdutoatributoExcluir.Enabled = false;

				// Desabilita o botão salvar
				this.btnCadProdutoatributoSalvar.Enabled = false;

				// Habilita o botao novo
				this.btnCadProdutoatributoNovo.Enabled = true;

			}
			catch (Exception ex)
			{

				throw ex;
			}
			
		}
		protected void btnCadProdutoatributoNovo_Click(object sender, EventArgs e)
		{
			//Limpa formulario, para a entrada de novo registro
			Util.LimparCampos(this.panelProdutoatributo);
			// Habilita os campos para edição
				Util.HabilitarCampos(true, this.panelProdutoatributo);

			this.ltProdutoatributoCadastradoPor.Text = "";
			this.ltProdutoatributoEditadoPor.Text = "";
			this.ltProdutoatributoDataCadastro.Text = "";
			this.ltProdutoatributoDataEdicao.Text = "";

			// Trava apenas os text box da PK
			this.txtCadProdutoatributoIdProdutoAtributo.Enabled = false;

			// Trava botão de edição
			this.btnCadProdutoatributoEditar.Enabled = false;

			// Trava botão de exclusao
			this.btnCadProdutoatributoExcluir.Enabled = false;

			// Trava botão de novo
			this.btnCadProdutoatributoNovo.Enabled = false;

			// Habilita o botão salvar
			this.btnCadProdutoatributoSalvar.Enabled = true;

			this.txtCadProdutoatributoAtributo.Focus();

		}

		protected void imgbCadProdutoatributoVisualizar_Click(object sender, ImageClickEventArgs e)
		{
			// Declara objetos
			ProdutoatributoVO produtoatributoVO = null;
			int idProdutoAtributo = 0;

			try
			{
				//Recupera os argumentos com o ID do objeto
				string[] argumentos = ((ImageButton)sender).CommandArgument.Split(';');
				idProdutoAtributo = Int32.Parse(argumentos[0]);

				//Recupera o objeto
				produtoatributoVO = this.SgiDAOT.getProdutoatributo(idProdutoAtributo);

				this.txtCadProdutoatributoIdProdutoAtributo.Text = produtoatributoVO.idProdutoAtributo.ToString();
				this.txtCadProdutoatributoAtributo.Text = produtoatributoVO.atributo;
				this.txtCadProdutoatributoValor.Text = produtoatributoVO.valor;
				this.ltProdutoatributoCadastradoPor.Text = produtoatributoVO.cadastradoPor;
				this.ltProdutoatributoEditadoPor.Text = produtoatributoVO.editadoPor;
				this.ltProdutoatributoDataCadastro.Text = produtoatributoVO.cadastro.ToString("dd/MM/yyyy");
				this.ltProdutoatributoDataEdicao.Text = produtoatributoVO.edicao.ToString("dd/MM/yyyy");

				//Desabilita campos para edição
				Util.HabilitarCampos(false, this.panelProdutoatributo);

				//Desabilita botão salvar
				this.btnCadProdutoatributoSalvar.Enabled = false;

				//Habilita botão editar
				this.btnCadProdutoatributoEditar.Enabled = true;

				//Habilita botão excluir
				this.btnCadProdutoatributoExcluir.Enabled = true;

				//Habilita botão novo
				this.btnCadProdutoatributoNovo.Enabled = true;

			}
			catch (Exception ex)
			{

				throw ex;
			}
		}

		#endregion

	}
}
